Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Raw β€’ Download

desktopApp/build.gradle.kts fix/qr-error-correction (7b45f84f) Text, 16.28 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72import T7ee787dev.detekt.gradle.Detekt
Tff7b72import T7ee787org.jetbrains.compose.desktop.application.dsl.TargetFormat
Tff7b72import T7ee787org.jetbrains.kotlin.gradle.dsl.JvmTarget
Tff7b72import T7ee787org.meshtastic.buildlogic.configureGraphTasks
Tff7b72import T7ee787org.meshtastic.buildlogic.resolveVersionInfo

Te6edf3plugins Tb4b4b4{
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3kotlinTb4b4b4.Te6edf3jvmTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3compilerTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3detektTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3spotlessTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3koinTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3koverTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3aboutlibrariesTb4b4b4)
T8b949e// Version-less because Mokkery is embedded in the convention-plugin classpath.
Te6edf3idTb4b4b4(Ta5d6ff"Ta5d6ffdev.mokkeryTa5d6ff"Tb4b4b4)
Tb4b4b4}

Te6edf3configureGraphTasksTb4b4b4(Tb4b4b4)

T8b949e// ── Version resolution (shared with app/build.gradle.kts via build-logic) ────
Tff7b72val Te6edf3versionInfo Tff7b72= Te6edf3resolveVersionInfoTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3resolvedIsDebugTb4b4b4: Tffa657Boolean Tff7b72= Te6edf3providersTb4b4b4.Te6edf3gradlePropertyTb4b4b4(Ta5d6ff"Ta5d6ffdesktop.releaseTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tff7b72!Tffa657itTb4b4b4.Te6edf3toBooleanTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3getOrElseTb4b4b4(Tff7b72trueTb4b4b4)

T8b949e// ── Generate DesktopBuildConfig ──────────────────────────────────────────────
T8b949e// Mirrors AGP's BuildConfig for Android so the desktop runtime has access to the
T8b949e// same version metadata without hardcoding.
T8b949e// Uses an abstract task with typed properties so the configuration cache can
T8b949e// serialise it without capturing build-script object references.
Tf0883e@CacheableTask
Tff7b72abstract Tff7b72class T56d364GenerateBuildConfigTask Tb4b4b4: Te6edf3DefaultTaskTb4b4b4(Tb4b4b4) Tb4b4b4{
Tf0883e@getTb4b4b4:Te6edf3Input Tff7b72abstract Tff7b72val Te6edf3contentTb4b4b4: Te6edf3PropertyTff7b72<Tffa657StringTff7b72>

Tf0883e@getTb4b4b4:Te6edf3OutputDirectory Tff7b72abstract Tff7b72val Te6edf3outputDirTb4b4b4: Te6edf3DirectoryProperty

Tf0883e@TaskAction
Tff7b72fun Td2a8ffgenerateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3dir Tff7b72= Te6edf3outputDirTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3asFile
Te6edf3dirTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)
Te6edf3dirTb4b4b4.Te6edf3resolveTb4b4b4(Ta5d6ff"Ta5d6ffDesktopBuildConfig.ktTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3writeTextTb4b4b4(Te6edf3contentTb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3buildConfigOutputDir Tff7b72= Te6edf3layoutTb4b4b4.Te6edf3buildDirectoryTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6ffgenerated/buildconfigTa5d6ff"Tb4b4b4)

Tff7b72val Te6edf3generateBuildConfig Tff7b72=
Te6edf3tasksTb4b4b4.Te6edf3registerTff7b72<Te6edf3GenerateBuildConfigTaskTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffgenerateDesktopBuildConfigTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3contentTb4b4b4.Te6edf3setTb4b4b4(
Ta5d6ff"""
Ta5d6ff |package org.meshtastic.desktop
|
|/**
| * Auto-generated build configuration for Meshtastic Desktop.
| * Do not edit β€” values are derived from config.properties and git at build time.
| */
|object DesktopBuildConfig {
| const val VERSION_CODE: Int = Tffd700${Te6edf3versionInfoTb4b4b4.Te6edf3versionCodeTffd700}
Ta5d6ff | const val VERSION_NAME: String = Ta5d6ff"Tffd700${Te6edf3versionInfoTb4b4b4.Te6edf3versionNameTffd700}Ta5d6ff"
Ta5d6ff | const val IS_DEBUG: Boolean = Tffd700$Te6edf3resolvedIsDebug
Ta5d6ff | const val APPLICATION_ID: String = Ta5d6ff"Ta5d6fforg.meshtastic.MeshtasticDesktopTa5d6ff"
Ta5d6ff | const val MIN_FW_VERSION: String = Ta5d6ff"Tffd700${Te6edf3versionInfoTb4b4b4.Te6edf3minFwVersionTffd700}Ta5d6ff"
Ta5d6ff | const val ABS_MIN_FW_VERSION: String = Ta5d6ff"Tffd700${Te6edf3versionInfoTb4b4b4.Te6edf3absMinFwVersionTffd700}Ta5d6ff"
Ta5d6ff |}
Ta5d6ff"""
Tb4b4b4.Te6edf3trimMarginTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3outputDirTb4b4b4.Te6edf3setTb4b4b4(Te6edf3buildConfigOutputDirTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6fforg/meshtastic/desktopTa5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4)
Tb4b4b4}

Te6edf3sourceSetsTb4b4b4.Te6edf3main Tb4b4b4{ Te6edf3kotlinTb4b4b4.Te6edf3srcDirTb4b4b4(Te6edf3generateBuildConfigTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3buildConfigOutputDir Tb4b4b4}Tb4b4b4) Tb4b4b4}

T8b949e// ── ProGuard configuration ───────────────────────────────────────────────────
T8b949e// compose-jb's standalone ProGuard task does NOT auto-include
T8b949e// `META-INF/proguard/*.pro` consumer rules from dependency jars (only R8 on
T8b949e// Android does). We therefore inline every keep rule we need into the two
T8b949e// static .pro files referenced below.

Te6edf3kotlin Tb4b4b4{
Te6edf3jvmToolchain Tb4b4b4{
Te6edf3languageVersionTb4b4b4.Te6edf3setTb4b4b4(Te6edf3JavaLanguageVersionTb4b4b4.Te6edf3ofTb4b4b4(T79c0ff2T79c0ff5Tb4b4b4)Tb4b4b4)
Te6edf3vendorTb4b4b4.Te6edf3setTb4b4b4(Te6edf3JvmVendorSpecTb4b4b4.Te6edf3JETBRAINSTb4b4b4)
Tb4b4b4}
Te6edf3compilerOptions Tb4b4b4{
Te6edf3jvmTargetTb4b4b4.Te6edf3setTb4b4b4(Te6edf3JvmTargetTb4b4b4.Te6edf3JVM_25Tb4b4b4)
Te6edf3freeCompilerArgsTb4b4b4.Te6edf3addTb4b4b4(Ta5d6ff"Ta5d6ff-jvm-default=no-compatibilityTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e// Exclude generated Compose resource files from detekt analysis
Te6edf3tasksTb4b4b4.Te6edf3withTypeTff7b72<Te6edf3DetektTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3configureEach Tb4b4b4{ Te6edf3excludeTb4b4b4(Ta5d6ff"Ta5d6ff**/generated/**Ta5d6ff"Tb4b4b4) Tb4b4b4}

Te6edf3composeTb4b4b4.Te6edf3desktop Tb4b4b4{
Te6edf3application Tb4b4b4{
Te6edf3mainClass Tff7b72= Ta5d6ff"Ta5d6fforg.meshtastic.desktop.MainKtTa5d6ff"

T8b949e// CMP resolves javaHome from the JVM running Gradle, not the Kotlin toolchain. On CI
T8b949e// that's Temurin 25, which ships without jmods (JEP 493): jlink still works, but the
T8b949e// ProGuard task derives -libraryjars from $javaHome/jmods and fails with ~857k
T8b949e// unresolved java.* references. Pin packaging to the JBR SDK toolchain (jmods
T8b949e// included) so ProGuard sees the platform classes and the bundled runtime is
T8b949e// deterministically JBR 25 on every machine.
T8b949e//
T8b949e// This assignment must stay EAGER here on the extension. Deferring it to lazy
T8b949e// `tasks.withType<AbstractProguardTask>().configureEach { javaHome.set(provider) }` (PR #6401)
T8b949e// does not reach `proguardReleaseJars` β€” the extension value still wins, ProGuard relaunches
T8b949e// under the Gradle JVM, and every Build Desktop leg goes red with the jmods-less signature.
Te6edf3javaHome Tff7b72=
Te6edf3javaToolchains
Tb4b4b4.Te6edf3launcherFor Tb4b4b4{
Te6edf3languageVersionTb4b4b4.Te6edf3setTb4b4b4(Te6edf3JavaLanguageVersionTb4b4b4.Te6edf3ofTb4b4b4(T79c0ff2T79c0ff5Tb4b4b4)Tb4b4b4)
Te6edf3vendorTb4b4b4.Te6edf3setTb4b4b4(Te6edf3JvmVendorSpecTb4b4b4.Te6edf3JETBRAINSTb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3metadata
Tb4b4b4.Te6edf3installationPath
Tb4b4b4.Te6edf3asFile
Tb4b4b4.Te6edf3absolutePath

Tff7b72val Te6edf3desktopJvmArgs Tff7b72=
Te6edf3listOfTb4b4b4(
Ta5d6ff"Ta5d6ff-Xmx2GTa5d6ff"Tb4b4b4,
T8b949e// Let the macOS title bar follow the system light/dark theme (ignored on other OSes).
Ta5d6ff"Ta5d6ff-Dapple.awt.application.appearance=systemTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-Dapple.awt.application.name=Meshtastic DesktopTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-Dcom.apple.mrj.application.apple.menu.about.name=Meshtastic DesktopTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff-Dcom.apple.bundle.identifier=org.meshtastic.MeshtasticDesktopTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3jvmArgsTb4b4b4(Tff7b72*Te6edf3desktopJvmArgsTb4b4b4.Te6edf3toTypedArrayTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3buildTypesTb4b4b4.Te6edf3releaseTb4b4b4.Te6edf3proguard Tb4b4b4{
T8b949e// CMP's default ProGuard (7.7.0) can't parse Java 25 class files in the JBR 25 jmods
Te6edf3versionTb4b4b4.Te6edf3setTb4b4b4(Ta5d6ff"Ta5d6ff7.9.1Ta5d6ff"Tb4b4b4)
Te6edf3isEnabledTb4b4b4.Te6edf3setTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3obfuscateTb4b4b4.Te6edf3setTb4b4b4(Tff7b72falseTb4b4b4) T8b949e// Open-source project β€” obfuscation adds no value
Te6edf3optimizeTb4b4b4.Te6edf3setTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3configurationFilesTb4b4b4.Te6edf3fromTb4b4b4(
T8b949e// Isolated Projects forbids reaching into the root project via rootProject.file().
Te6edf3isolatedTb4b4b4.Te6edf3rootProjectTb4b4b4.Te6edf3projectDirectoryTb4b4b4.Te6edf3fileTb4b4b4(Ta5d6ff"Ta5d6ffconfig/proguard/shared-rules.proTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3asFileTb4b4b4,
Te6edf3projectTb4b4b4.Te6edf3fileTb4b4b4(Ta5d6ff"Ta5d6ffproguard-rules.proTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3nativeDistributions Tb4b4b4{
Te6edf3packageName Tff7b72= Ta5d6ff"Ta5d6ffMeshtastic DesktopTa5d6ff"

T8b949e// Ensure critical JVM modules are included in the custom JRE bundled with the app.
T8b949e// jdeps might miss some of these if they are loaded via reflection or JNI.
Te6edf3modulesTb4b4b4(
Ta5d6ff"Ta5d6ffjava.net.httpTa5d6ff"Tb4b4b4, T8b949e// Ktor Java client
Ta5d6ff"Ta5d6ffjdk.accessibilityTa5d6ff"Tb4b4b4, T8b949e// Java Access Bridge for screen readers (JAWS, NVDA, VoiceOver)
Ta5d6ff"Ta5d6ffjdk.crypto.ecTa5d6ff"Tb4b4b4, T8b949e// Required for SSL/TLS HTTPS requests
Ta5d6ff"Ta5d6ffjdk.unsupportedTa5d6ff"Tb4b4b4, T8b949e// sun.misc.Unsafe used by Coroutines & Okio
Ta5d6ff"Ta5d6ffjava.sqlTa5d6ff"Tb4b4b4, T8b949e// Sometimes required by SQLite JNI
Ta5d6ff"Ta5d6ffjava.namingTa5d6ff"Tb4b4b4, T8b949e// Required by Ktor for DNS resolution
Tb4b4b4)

T8b949e// Default JVM arguments for the packaged application
T8b949e// Increase max heap size to prevent OOM issues on complex maps/data
Te6edf3jvmArgsTb4b4b4(Tff7b72*Te6edf3desktopJvmArgsTb4b4b4.Te6edf3toTypedArrayTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e// App Icon & OS Specific Configurations
Te6edf3macOS Tb4b4b4{
Te6edf3iconFileTb4b4b4.Te6edf3setTb4b4b4(Te6edf3projectTb4b4b4.Te6edf3fileTb4b4b4(Ta5d6ff"Ta5d6ffsrc/main/resources/icon.icnsTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3minimumSystemVersion Tff7b72= Ta5d6ff"Ta5d6ff12.0Ta5d6ff"
Te6edf3bundleID Tff7b72= Ta5d6ff"Ta5d6fforg.meshtastic.MeshtasticDesktopTa5d6ff"
Te6edf3appCategory Tff7b72= Ta5d6ff"Ta5d6ffpublic.app-category.utilitiesTa5d6ff"
Te6edf3entitlementsFileTb4b4b4.Te6edf3setTb4b4b4(Te6edf3projectTb4b4b4.Te6edf3fileTb4b4b4(Ta5d6ff"Ta5d6ffentitlements.plistTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3infoPlist Tb4b4b4{
Te6edf3extraKeysRawXml Tff7b72=
Ta5d6ff"""
Ta5d6ff <key>NSBluetoothAlwaysUsageDescription</key>
<string>Meshtastic uses Bluetooth to communicate with your Meshtastic radio device.</string>
<key>NSLocalNetworkUsageDescription</key>
<string>Meshtastic uses your local network to discover Meshtastic devices connected via WiFi.</string>
<key>NSUserNotificationAlertStyle</key>
<string>alert</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Meshtastic deep link</string>
<key>CFBundleURLSchemes</key>
<array>
<string>meshtastic</string>
</array>
</dict>
</array>
Ta5d6ff"""
Tb4b4b4.Te6edf3trimIndentTb4b4b4(Tb4b4b4)
Tb4b4b4}
T8b949e// macOS code signing and notarization.
T8b949e// Required CI secrets:
T8b949e// APPLE_SIGNING_IDENTITY – e.g. "Developer ID Application: Meshtastic LLC (TEAMID)"
T8b949e// APPLE_ID – Apple ID email used for notarization
T8b949e// APPLE_APP_SPECIFIC_PASSWORD – App-specific password from appleid.apple.com
T8b949e// APPLE_TEAM_ID – 10-character Apple Developer Team ID
Tff7b72val Te6edf3signMacOs Tff7b72= Te6edf3providersTb4b4b4.Te6edf3environmentVariableTb4b4b4(Ta5d6ff"Ta5d6ffSIGN_MACOSTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toBooleanTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3getOrElseTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3signMacOsTb4b4b4) Tb4b4b4{
Te6edf3signing Tb4b4b4{
Te6edf3signTb4b4b4.Te6edf3setTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3identityTb4b4b4.Te6edf3setTb4b4b4(Te6edf3providersTb4b4b4.Te6edf3environmentVariableTb4b4b4(Ta5d6ff"Ta5d6ffAPPLE_SIGNING_IDENTITYTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3notarization Tb4b4b4{
Te6edf3appleIDTb4b4b4.Te6edf3setTb4b4b4(Te6edf3providersTb4b4b4.Te6edf3environmentVariableTb4b4b4(Ta5d6ff"Ta5d6ffAPPLE_IDTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3passwordTb4b4b4.Te6edf3setTb4b4b4(Te6edf3providersTb4b4b4.Te6edf3environmentVariableTb4b4b4(Ta5d6ff"Ta5d6ffAPPLE_APP_SPECIFIC_PASSWORDTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3teamIDTb4b4b4.Te6edf3setTb4b4b4(Te6edf3providersTb4b4b4.Te6edf3environmentVariableTb4b4b4(Ta5d6ff"Ta5d6ffAPPLE_TEAM_IDTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3windows Tb4b4b4{
Te6edf3iconFileTb4b4b4.Te6edf3setTb4b4b4(Te6edf3projectTb4b4b4.Te6edf3fileTb4b4b4(Ta5d6ff"Ta5d6ffsrc/main/resources/icon.icoTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3menuGroup Tff7b72= Ta5d6ff"Ta5d6ffMeshtasticTa5d6ff"
Te6edf3shortcut Tff7b72= Tff7b72true
Te6edf3menu Tff7b72= Tff7b72true
Te6edf3dirChooser Tff7b72= Tff7b72true
T8b949e// Stable UUID ensures MSI upgrades replace the previous installation
T8b949e// rather than installing side-by-side. NEVER change this value.
Te6edf3upgradeUuid Tff7b72= Ta5d6ff"Ta5d6ff4974EA87-98AA-470E-B590-0BD5CF9FAE8ETa5d6ff"
Tb4b4b4}
Te6edf3linux Tb4b4b4{
Te6edf3iconFileTb4b4b4.Te6edf3setTb4b4b4(Te6edf3projectTb4b4b4.Te6edf3fileTb4b4b4(Ta5d6ff"Ta5d6ffsrc/main/resources/icon.pngTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3menuGroup Tff7b72= Ta5d6ff"Ta5d6ffNetworkTa5d6ff"
Te6edf3debMaintainer Tff7b72= Ta5d6ff"Ta5d6ffdevelopers@meshtastic.orgTa5d6ff"
Te6edf3appCategory Tff7b72= Ta5d6ff"Ta5d6ffNetworkTa5d6ff"
Te6edf3rpmLicenseType Tff7b72= Ta5d6ff"Ta5d6ffGPLv3+Ta5d6ff"
Tb4b4b4}

T8b949e// Define target formats based on the current host OS to avoid configuration errors
T8b949e// (e.g., trying to configure Linux AppImage notarization on macOS).
Tff7b72val Te6edf3currentOs Tff7b72= Te6edf3providersTb4b4b4.Te6edf3systemPropertyTb4b4b4(Ta5d6ff"Ta5d6ffos.nameTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3getTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72when Tb4b4b4{
Te6edf3currentOsTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffmacTa5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Te6edf3targetFormatsTb4b4b4(Te6edf3TargetFormatTb4b4b4.Te6edf3DmgTb4b4b4)
Te6edf3currentOsTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffwinTa5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Te6edf3targetFormatsTb4b4b4(Te6edf3TargetFormatTb4b4b4.Te6edf3MsiTb4b4b4, Te6edf3TargetFormatTb4b4b4.Te6edf3ExeTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3targetFormatsTb4b4b4(Te6edf3TargetFormatTb4b4b4.Te6edf3DebTb4b4b4, Te6edf3TargetFormatTb4b4b4.Te6edf3RpmTb4b4b4, Te6edf3TargetFormatTb4b4b4.Te6edf3AppImageTb4b4b4)
Tb4b4b4}

T8b949e// Reuse the resolved version from the top of this script (mirrors app/build.gradle.kts).
T8b949e// Native installers require strict numeric semantic versions (X.Y.Z) without suffixes.
Tff7b72val Te6edf3sanitizedVersion Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff^Ta5d6ff\\Ta5d6ffd+Ta5d6ff\\Ta5d6ff.Ta5d6ff\\Ta5d6ffd+Ta5d6ff\\Ta5d6ff.Ta5d6ff\\Ta5d6ffd+Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3findTb4b4b4(Te6edf3versionInfoTb4b4b4.Te6edf3versionNameTb4b4b4)Tff7b72?.Te6edf3value Tff7b72?: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"
Te6edf3packageVersion Tff7b72= Te6edf3sanitizedVersion

Te6edf3description Tff7b72= Ta5d6ff"Ta5d6ffMeshtastic Desktop ApplicationTa5d6ff"
Te6edf3vendor Tff7b72= Ta5d6ff"Ta5d6ffMeshtastic LLCTa5d6ff"
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3dependencies Tb4b4b4{
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3aboutlibrariesTb4b4b4.Te6edf3coreTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3aboutlibrariesTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3m3Tb4b4b4)

T8b949e// Coil image loading (network + SVG decoding for device hardware images)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3coilTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3coilTb4b4b4.Te6edf3networkTb4b4b4.Te6edf3ktor3Tb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3coilTb4b4b4.Te6edf3svgTb4b4b4)

T8b949e// Core KMP modules (JVM variants)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3commonTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3diTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3navigationTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3lifecycleTb4b4b4.Te6edf3viewmodelTb4b4b4.Te6edf3navigation3Tb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3repositoryTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3domainTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3dataTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3databaseTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3datastoreTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3prefsTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3networkTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3takserverTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3resourcesTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3serviceTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3uiTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protobufsTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3bleTb4b4b4)

T8b949e// Feature modules (JVM variants for real composable wiring)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3settingsTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3docsTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3nodeTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3messagingTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3connectionsTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3mapTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3discoveryTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3firmwareTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3wifiProvisionTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3featureTb4b4b4.Te6edf3introTb4b4b4)

T8b949e// Compose Desktop
Te6edf3implementationTb4b4b4(Te6edf3composeTb4b4b4.Te6edf3desktopTb4b4b4.Te6edf3currentOsTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4.Te6edf3animationTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4.Te6edf3material3Tb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4.Te6edf3runtimeTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4.Te6edf3foundationTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4.Te6edf3resourcesTb4b4b4)

T8b949e// JetBrains Material 3 Adaptive (multiplatform ListDetailPaneScaffold)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3material3Tb4b4b4.Te6edf3adaptiveTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3material3Tb4b4b4.Te6edf3adaptiveTb4b4b4.Te6edf3layoutTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3material3Tb4b4b4.Te6edf3adaptiveTb4b4b4.Te6edf3navigationTb4b4b4)

T8b949e// Navigation 3 (JetBrains fork β€” multiplatform)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3navigation3Tb4b4b4.Te6edf3uiTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3lifecycleTb4b4b4.Te6edf3viewmodelTb4b4b4.Te6edf3navigation3Tb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3lifecycleTb4b4b4.Te6edf3viewmodelTb4b4b4.Te6edf3composeTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3lifecycleTb4b4b4.Te6edf3runtimeTb4b4b4.Te6edf3composeTb4b4b4)

T8b949e// Koin DI
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3koinTb4b4b4.Te6edf3coreTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3koinTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3viewmodelTb4b4b4)

Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3coroutinesTb4b4b4.Te6edf3coreTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3coroutinesTb4b4b4.Te6edf3swingTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3serializationTb4b4b4.Te6edf3coreTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kermitTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3okioTb4b4b4)

T8b949e// Ktor HttpClient (Java engine for JVM/Desktop)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3ktorTb4b4b4.Te6edf3clientTb4b4b4.Te6edf3javaTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3ktorTb4b4b4.Te6edf3clientTb4b4b4.Te6edf3contentTb4b4b4.Te6edf3negotiationTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3ktorTb4b4b4.Te6edf3clientTb4b4b4.Te6edf3loggingTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3ktorTb4b4b4.Te6edf3serializationTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3jsonTb4b4b4)

Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3androidxTb4b4b4.Te6edf3pagingTb4b4b4.Te6edf3commonTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3androidxTb4b4b4.Te6edf3datastoreTb4b4b4.Te6edf3preferencesTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3androidxTb4b4b4.Te6edf3datastoreTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3androidxTb4b4b4.Te6edf3roomTb4b4b4.Te6edf3runtimeTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3androidxTb4b4b4.Te6edf3sqliteTb4b4b4.Te6edf3bundledTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3collectionsTb4b4b4.Te6edf3immutableTb4b4b4)

Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jnaTb4b4b4)

Te6edf3testRuntimeOnlyTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3junitTb4b4b4.Te6edf3vintageTb4b4b4.Te6edf3engineTb4b4b4)
Te6edf3testImplementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4)
Te6edf3testImplementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3koinTb4b4b4.Te6edf3testTb4b4b4)
Te6edf3testImplementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3coroutinesTb4b4b4.Te6edf3testTb4b4b4)
Te6edf3testImplementationTb4b4b4(Te6edf3kotlinTb4b4b4(Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Served by rngit 1.5.4 - Generated in 0.05s